Was ist Django?

Das Web Framework für Perfektionisten mit Deadlines

"The web framework for perfectionists with deadlines"

— Django Software Foundation

In dieser Präsentation lernen Sie:

  • Was Django ist und wofür man es nutzt
  • Welche Arten von Projekten Sie damit bauen können
  • Was das Django REST Framework (DRF) ist
  • Wie Django und DRF zusammenarbeiten
  • Warum Django so beliebt ist

🎯 Was ist Django? - Die Grundlagen

Django ist ein Web-Framework für Python

Aber was bedeutet das eigentlich?

🤔 Web-Framework - Eine Erklärung:

Stellen Sie sich vor, Sie wollen ein Haus bauen. Sie könnten:

  • Von Grund auf: Jeden Stein selbst brennen, jedes Brett selbst sägen...
  • Mit einem Fertighaus-System: Vorgefertigte Wände, Türen, Fenster - Sie setzen nur zusammen

Django ist wie ein Fertighaus-System für Websites!

Django gibt Ihnen fertige Bausteine:

🗄️

Datenbank-Verwaltung

Speichern und Abrufen von Daten (Benutzer, Artikel, Bestellungen...)

🔐

Benutzer-Verwaltung

Login, Registrierung, Passwort-Reset - alles fertig!

🎨

Template-System

HTML-Seiten mit dynamischen Inhalten füllen

🛡️

Sicherheit

Schutz vor Hackerangriffen ist eingebaut

💡 Django in einfachen Worten

Ohne Django (Alles selbst programmieren):

# Sie müssen ALLES selbst schreiben:

1. Wie speichere ich Benutzerdaten?
2. Wie prüfe ich, ob ein Passwort sicher ist?
3. Wie verhindere ich SQL-Injection-Angriffe?
4. Wie zeige ich eine HTML-Seite an?
5. Wie verbinde ich mich mit der Datenbank?
6. Wie handle ich Sessions?
7. ...und 1000 andere Dinge

→ Monate an Arbeit! 😰

✅ Mit Django:

# Django gibt Ihnen fertige Lösungen:

from django.contrib.auth.models import User  # Benutzer-System: ✅
from django.db import models                  # Datenbank: ✅
from django.shortcuts import render           # HTML anzeigen: ✅

# Sie können sich auf Ihre Idee konzentrieren!
# Django kümmert sich um den Rest.

→ Tage statt Monate! 🚀

🎯 Das Prinzip:

DRY - Don't Repeat Yourself

Warum das Rad neu erfinden? Django hat die häufigsten Probleme bereits gelöst!

📜 Django's Geschichte - Woher kommt es?

2003

Die Geburt

Wo? Lawrence Journal-World (Zeitung in Kansas, USA)

Problem: Journalisten brauchten schnell neue Web-Features

Lösung: Adrian Holovaty & Simon Willison entwickelten ein Framework

→ Musste schnell sein, robust sein, leicht bedienbar sein

2005

Open Source

Django wurde der Öffentlichkeit zur Verfügung gestellt

Namensgebung: Nach Django Reinhardt (Jazz-Gitarrist)

2008

Django 1.0

Erste stabile Version

Django Software Foundation gegründet

Heute

Django 5.x

Über 20 Jahre Entwicklung

Millionen von Websites weltweit

Aktive Community von tausenden Entwicklern

🌟 Interessante Fakten:

  • Django wurde aus der Praxis geboren, nicht in einem Labor
  • Die Entwickler waren Journalisten, keine Informatiker
  • Daher der Fokus auf Geschwindigkeit und Benutzerfreundlichkeit
  • Django ist kostenlos und wird es immer bleiben

🏗️ Was kann man mit Django bauen?

Django ist vielseitig - Von kleinen Blogs bis zu Instagram!

📰

1. Content-Management-Systeme (CMS)

Websites mit Artikeln, News, Blogs

  • Beispiel: Online-Zeitung, Blog-Plattform
  • Features: Artikel schreiben, Kategorien, Kommentare
  • Vorteil: Django's Admin-Panel → sofort einsatzbereit!

🌟 Bekanntes Beispiel: The Washington Post nutzt Django

🛒

2. E-Commerce Shops

Online-Shops mit Produkten, Warenkorb, Bezahlung

  • Beispiel: Webshop für Bücher, Kleidung, Elektronik
  • Features: Produktkatalog, Bestellungen, Zahlungsabwicklung
  • Vorteil: Sicher, skalierbar, viele Shop-Plugins verfügbar

📦 Frameworks wie Django Oscar bieten fertige Shop-Lösungen

📱

3. Social Networks

Plattformen wie Facebook, Instagram

  • Beispiel: Community-Plattform mit Profilen, Posts, Likes
  • Features: User-Profile, Feed, Messaging, Notifications
  • Vorteil: User-Management eingebaut, skaliert auf Millionen User

🌟 Bekanntes Beispiel: Instagram wurde ursprünglich mit Django gebaut!

🎓

4. Learning Management Systeme

Online-Kurse, E-Learning-Plattformen

  • Beispiel: Plattform für Videokurse, Tests, Zertifikate
  • Features: Kursverwaltung, Fortschritt-Tracking, Bewertungen
  • Vorteil: Flexible Rechteverwaltung (Lehrer, Schüler, Admin)

🎯 Viele Online-Akademien nutzen Django

🏦

5. Business-Anwendungen

Interne Tools, CRM, Projektmanagement

  • Beispiel: Ticketsystem, HR-Portal, Buchhaltungstool
  • Features: Dashboards, Datenanalyse, Reporting
  • Vorteil: Schnell entwickelt, leicht anpassbar

💼 Viele Startups nutzen Django für MVP (Minimum Viable Product)

🔌

6. REST APIs

Backend für Mobile Apps, SPAs, IoT

  • Beispiel: API für eine React/Vue App oder Mobile App
  • Features: JSON-Daten, Authentication, Rate-Limiting
  • Vorteil: Django REST Framework (DRF) → super einfach!

🚀 Unser Kurs-Fokus! Von Django zu REST APIs

🌟 Wer nutzt Django? - Bekannte Beispiele

Django ist Production-Ready - Diese Giganten vertrauen darauf:

📸 Instagram

Die größte Django-Installation der Welt!

  • Nutzer: Über 2 Milliarden Menschen
  • Warum Django? Schnelle Entwicklung, Skalierbarkeit
  • Besonderheit: Instagram startete als kleines Django-Projekt
  • Heute: Hunderte Django-Server weltweit

"Django ermöglicht uns, schnell zu experimentieren und zu wachsen"

🎵 Spotify

Musik-Streaming für Millionen

  • Einsatz: Backend-Services, Datenanalyse
  • Warum Django? Schnelle Entwicklung von Microservices
  • Features: Playlists, Empfehlungen, User-Daten

📰 The Washington Post

Traditionelle Zeitung goes Digital

  • Einsatz: Content-Management-System
  • Warum Django? Ursprünglich für Zeitungen entwickelt!
  • Features: Artikel-Verwaltung, Multimedia, Live-News

📍 Pinterest

Visuelles Discovery-Tool

  • Nutzer: Über 400 Millionen monatlich
  • Warum Django? Flexible Datenbankstruktur
  • Features: Pins, Boards, Empfehlungen

🚗 Disqus

Kommentar-System für Millionen Websites

  • Einsatz: Kommentar-Widgets für Websites
  • Warum Django? Skaliert auf Milliarden Kommentare
  • Traffic: Über 50 Millionen Kommentare/Monat

🎬 YouTube (Teilweise)

Video-Plattform (ursprünglich)

  • Einsatz: Teile der ursprünglichen Plattform
  • Hinweis: Heute komplex mit vielen Technologien
  • Django: Für schnelle Prototypen und Features

💡 Was bedeutet das für Sie?

Wenn Django gut genug für Instagram und Spotify ist, ist es gut genug für Ihr Projekt! Sie lernen eine Technologie, die in der echten Welt eingesetzt wird.

🏛️ Wie funktioniert Django? - Die MTV-Architektur

MTV = Model-Template-View

Django organisiert Code in drei klare Bereiche

🤔 Stellen Sie sich eine Restaurant-Küche vor:

┌─────────────────────────────────────────────────────────┐
│                      Restaurant                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  👨‍🍳 Koch (View)          📋 Rezept (Template)          │
│  Bereitet Essen zu      Wie das Essen                   │
│  nach Rezept            präsentiert wird                │
│                                                         │
│         ↕                       ↕                       │
│                                                         │
│  🥘 Zutaten (Model)                                    │
│  Alle Lebensmittel                                      │
│  im Kühlschrank                                         │
│                                                         │
└─────────────────────────────────────────────────────────┘
🗄️

Model (M) - Die Daten

Was wird gespeichert?

  • Aufgabe: Struktur der Datenbank definieren
  • Beispiel: Ein "Film" hat Titel, Jahr, Genre, Rating
  • In Django: Python-Klassen → werden zu Datenbank-Tabellen
class Movie(models.Model):
    title = models.CharField(max_length=200)
    year = models.IntegerField()
    genre = models.CharField(max_length=100)
    rating = models.DecimalField()

# → Wird zu Datenbank-Tabelle "movies"
🎨

Template (T) - Die Darstellung

Wie sieht es aus?

  • Aufgabe: HTML mit dynamischen Daten füllen
  • Beispiel: Liste aller Filme als HTML-Tabelle
  • In Django: HTML + Django-Syntax
<h1>Alle Filme</h1>
<ul>
  {% for movie in movies %}
    <li>{{ movie.title }} ({{ movie.year }})</li>
  {% endfor %}
</ul>

# {{ }} → Variable einfügen
# {% %} → Logik (for, if, ...)
⚙️

View (V) - Die Logik

Was passiert?

  • Aufgabe: Daten holen, verarbeiten, zurückgeben
  • Beispiel: Alle Filme aus DB holen & an Template übergeben
  • In Django: Python-Funktionen oder Klassen
def movie_list(request):
    # 1. Daten aus DB holen
    movies = Movie.objects.all()
    
    # 2. An Template übergeben
    return render(request, 'movies.html', {
        'movies': movies
    })

# → Browser zeigt gefülltes HTML an

🔄 MTV im Detail - Wie arbeitet Django?

Der komplette Ablauf einer Anfrage:

┌─────────────┐
│   Browser   │  "Ich will alle Filme sehen!"
│   (Client)  │  → GET http://example.com/movies/
└─────────────┘
       │
       ▼
┌─────────────────────────────────────────────────────────┐
│                     Django Server                       │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  1️⃣ URLs (Router)                                       
│  urlpatterns = [                                        │
│     "Welche View ist für /movies/ zuständig?"           │
│     → movie_list View                                   │
│                                                         │
│         ▼                                               │
│                                                         │
│  2️⃣ View (Logik)                                        
│     def movie_list(request):                            │
│         movies = Movie.objects.all()  ← 3️⃣ Model (DB)   
│         return render(..., movies)                      │
│                 │                                       │
│                 ▼                                       │
│                                                         │
│  4️⃣ Template (HTML)                                    
│     {% for movie in movies %}                           │
│       
  • {{ movie.title }}
  • │ │ {% endfor %} │ │ │ └─────────────────────────────────────────────────────────┘ │ ▼ Fertiges HTML ┌─────────────┐ │ Browser │ Zeigt Liste der Filme └─────────────┘
    1

    URL-Routing

    Browser fragt: /movies/

    Django schaut in urls.py: Welche View passt?

    urlpatterns = [
        path('movies/', movie_list),  # ← Diese View!
    ]
    2

    View ausführen

    Die movie_list View wird aufgerufen

    def movie_list(request):
        # request = alle Infos vom Browser
        # (welche URL, welcher User, ...)
    3

    Daten aus Model holen

    View fragt Model: "Gib mir alle Filme!"

    movies = Movie.objects.all()
    # Django übersetzt das zu SQL:
    # SELECT * FROM movies;
    4

    Template rendern

    View gibt Daten an Template

    return render(request, 'movies.html', {
        'movies': movies  # ← Daten fürs Template
    })
    5

    HTML zurückgeben

    Template wird mit Daten gefüllt → fertiges HTML

    Django sendet HTML zurück zum Browser

    🌐 Django für traditionelle Websites

    Server-Side Rendering - Die klassische Art

    Django generiert komplette HTML-Seiten auf dem Server

    Wie funktioniert eine traditionelle Django-Website?

    User klickt Link → Django generiert HTML → Browser zeigt Seite
    
    Beispiel: Blog-Website
    
    1. User besucht: www.meinblog.de/artikel/
    2. Django:
       - Holt alle Artikel aus der Datenbank
       - Steckt sie in ein HTML-Template
       - Sendet fertiges HTML zurück
    3. Browser zeigt die Seite
    
    Bei jedem Link-Klick → neues HTML vom Server!

    Vorteile

    • Einfach: Alles in einem Projekt (HTML + Backend)
    • SEO-freundlich: Suchmaschinen lieben Server-HTML
    • Schnell entwickelt: Django macht viel automatisch
    • Bewährt: Funktioniert seit 20 Jahren
    ⚠️

    Nachteile

    • Reload: Jeder Klick lädt neue Seite (nicht so flüssig)
    • Kein "App-Feeling": Nicht wie eine Mobile-App
    • Backend + Frontend vermischt: Schwer zu trennen

    🎯 Perfekt für:

    • 📰 Blogs, News-Seiten, Content-Plattformen
    • 🏢 Unternehmens-Websites mit CMS
    • 📚 Dokumentations-Seiten
    • 🏪 Kleine bis mittlere E-Commerce-Shops
    • 📋 Admin-Panels, Backoffice-Tools

    🔌 Django als REST API Backend

    Die moderne Art - Nur Daten, kein HTML

    Django wird zum reinen Daten-Lieferanten

    Was ist eine REST API?

    Stellen Sie sich einen Restaurant-Service vor:

    • Traditionell (Server-HTML): Sie bekommen fertig angerichtetes Essen auf dem Teller
    • REST API: Sie bekommen die Zutaten in Boxen, richten selbst an (Frontend macht das HTML)

    🔄 Wie funktioniert das?

    ┌──────────────┐                    ┌──────────────┐
    │   Frontend   │ ← JSON-Daten →     │    Django    │
    │ (React/Vue)  │    über HTTP       │   REST API   │
    │              │                    │   (Backend)  │
    └──────────────┘                    └──────────────┘
         │                                     │
         │ 1. GET /api/movies/                 │
         │ ─────────────────────────────────→  │
         │                                     │ Holt Daten
         │                                     │ aus DB
         │                                     │
         │ 2. Response: JSON                   │
         │ ←─────────────────────────────────  │
         │    [                                │
         │      {"title": "Matrix", ...}       │
         │    ]                                │
         │                                     │
         │ 3. Frontend baut HTML               │
         │    
  • Matrix
  • │ │ │ └──────────────┘ └──────────────┘
    📱

    Beispiel: Mobile App

    Smartphone-App (iOS/Android)
             │
             │ GET /api/movies/
             ▼
       Django REST API
             │
             │ [{"title": "Matrix"}, ...]
             ▼
        App zeigt Liste
    
    # Eine API für alle Plattformen!
    🌐

    Beispiel: React Website

    React im Browser
             │
             │ fetch('/api/movies/')
             ▼
       Django REST API
             │
             │ [{"title": "Matrix"}, ...]
             ▼
        React baut HTML
    
    # Smooth, schnell, App-Feeling!

    ⚖️ Traditionell vs REST API - Der Vergleich

    🌐

    Traditionelle Django-Website

    # views.py
    def movie_list(request):
        movies = Movie.objects.all()
        return render(request, 'movies.html', {
            'movies': movies
        })
    
    # Response: Komplettes HTML
    <!DOCTYPE html>
    <html>
      <body>
        <h1>Filme</h1>
        <ul>
          <li>Matrix</li>
          <li>Inception</li>
        </ul>
      </body>
    </html>
    
    # Browser zeigt direkt die Seite
    # Jeder Klick → neue HTML-Seite
    🔌

    Django REST API

    # views.py
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    # Response: Nur JSON-Daten
    [
      {
        "id": 1,
        "title": "Matrix",
        "year": 1999,
        "genre": "Sci-Fi"
      },
      {
        "id": 2,
        "title": "Inception",
        "year": 2010,
        "genre": "Sci-Fi"
      }
    ]
    
    # Frontend (React/Vue/App) baut HTML
    # Keine Seiten-Reloads, smooth!

    📊 Vergleichstabelle:

    ┌────────────────────┬─────────────────────┬────────────────────────┐
    │ Kriterium          │ Traditionell        │ REST API               │
    ├────────────────────┼─────────────────────┼────────────────────────┤
    │ Output             │ HTML                │ JSON/XML               │
    │ Frontend           │ Django Templates    │ React/Vue/Angular/App  │
    │ Seitenreload       │ Bei jedem Klick     │ Keine (SPA)            │
    │ Use Case           │ Websites            │ Apps, SPAs, IoT        │
    │ Entwicklung        │ Alles in Django     │ Frontend getrennt      │
    │ Mobile-fähig       │ ⚠️ Nicht optimal    │ ✅ Perfekt             │
    │ SEO                │ ✅ Sehr gut         │ ⚠️ Braucht SSR         │
    │ Komplexität        │ ✅ Einfacher        │ ⚠️ Zwei Projekte       │
    │ Flexibilität       │ ⚠️ Eingeschränkt    │ ✅ Sehr flexibel       │
    │ Performance        │ ⚠️ Jede Seite neu   │ ✅ Nur Daten laden     │
    └────────────────────┴─────────────────────┴────────────────────────┘

    🎯 Was ist Django REST Framework (DRF)?

    DRF = Django's Superkraft für APIs

    Ein Toolkit, das aus Django einen API-Superhelden macht!

    🤔 Das Problem ohne DRF:

    # Django kann auch APIs ohne DRF, aber...
    
    from django.http import JsonResponse
    from .models import Movie
    
    def movie_list(request):
        # 1. Daten aus DB holen
        movies = Movie.objects.all()
        
        # 2. Manuell zu JSON konvertieren
        data = []
        for movie in movies:
            data.append({
                'id': movie.id,
                'title': movie.title,
                'year': movie.year,
                # ... jedes Feld manuell!
            })
        
        # 3. Als JSON zurückgeben
        return JsonResponse(data, safe=False)
    
    # ❌ Viel Arbeit!
    # ❌ Keine Validierung
    # ❌ Keine Authentication
    # ❌ Keine Dokumentation
    # ❌ Kein Standard

    ✅ Die Lösung: Django REST Framework

    from rest_framework import viewsets
    from .models import Movie
    from .serializers import MovieSerializer
    
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    # Das war's! DRF macht automatisch:
    # ✅ JSON-Konvertierung
    # ✅ Validierung
    # ✅ CRUD-Operationen (Create, Read, Update, Delete)
    # ✅ Authentication
    # ✅ Permissions
    # ✅ Pagination
    # ✅ Filtering
    # ✅ Dokumentation
    # ✅ Browsable API (Web-UI zum Testen!)
    
    # Von 30 Zeilen auf 3 Zeilen! 🚀

    ✨ DRF Features - Was macht es so besonders?

    🔄

    1. Serializers - Die Übersetzer

    Python ↔ JSON automatisch

    class MovieSerializer(serializers.ModelSerializer):
        class Meta:
            model = Movie
            fields = '__all__'
    
    # Macht automatisch:
    # Python Object → JSON (für Response)
    # JSON → Python Object (von Request)
    # + Validierung inklusive!

    Sie definieren einmal die Struktur, DRF macht den Rest!

    🎯

    2. ViewSets - CRUD auf Autopilot

    Alle Operationen automatisch

    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    # Generiert automatisch:
    # GET    /movies/     → Liste aller Filme
    # POST   /movies/     → Neuen Film erstellen
    # GET    /movies/1/   → Film #1 Details
    # PUT    /movies/1/   → Film #1 bearbeiten
    # DELETE /movies/1/   → Film #1 löschen
    
    # Alles ohne extra Code!
    🔗

    3. Router - URLs automatisch

    Kein URL-Mapping nötig

    from rest_framework.routers import DefaultRouter
    
    router = DefaultRouter()
    router.register('movies', MovieViewSet)
    
    # Generiert automatisch alle URLs:
    # /movies/
    # /movies/{id}/
    # + Namen für reverse()
    
    # Eine Zeile → komplettes Routing!
    🔐

    4. Authentication - Eingebaut

    Token, JWT, Session - fertig!

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.TokenAuthentication',
        ]
    }
    
    # Token-Auth aktiviert!
    # User bekommt Token bei Login
    # Token in Header → User authentifiziert
    
    # Alles automatisch!
    🛡️

    5. Permissions - Wer darf was?

    Zugriffskontrolle leicht gemacht

    from rest_framework.permissions import IsAuthenticated
    
    class MovieViewSet(viewsets.ModelViewSet):
        permission_classes = [IsAuthenticated]
        
    # Nur angemeldete User dürfen zugreifen!
    # Viele vordefinierte Permissions:
    # - AllowAny
    # - IsAuthenticated
    # - IsAdminUser
    # - IsAuthenticatedOrReadOnly
    # + eigene Permissions möglich!
    🌐

    6. Browsable API - Web-Interface

    API im Browser testen!

    # Automatisch dabei:
    # Schöne Web-UI zum Testen
    # Im Browser: http://localhost:8000/api/movies/
    
    # Features:
    # - API durchsuchen
    # - POST-Requests abschicken
    # - JSON formatiert anzeigen
    # - Formulare für Daten-Eingabe
    # - Login-Funktion
    
    # Perfekt für Entwicklung!

    🎬 DRF in der Praxis - Ein komplettes Beispiel

    Von der Idee zur fertigen API in 5 Schritten

    Beispiel: Movie-API für eine Film-App

    1

    Model definieren (Django)

    # models.py
    class Movie(models.Model):
        title = models.CharField(max_length=200)
        year = models.IntegerField()
        genre = models.CharField(max_length=100)
        rating = models.DecimalField(max_digits=3, decimal_places=1)
        
        def __str__(self):
            return f"{self.title} ({self.year})"
    
    # python manage.py makemigrations
    # python manage.py migrate
    # → Datenbank-Tabelle erstellt!
    2

    Serializer erstellen (DRF)

    # serializers.py
    from rest_framework import serializers
    from .models import Movie
    
    class MovieSerializer(serializers.ModelSerializer):
        class Meta:
            model = Movie
            fields = ['id', 'title', 'year', 'genre', 'rating']
    
    # Kann jetzt Python ↔ JSON übersetzen
    # + Validiert automatisch!
    3

    ViewSet erstellen (DRF)

    # views.py
    from rest_framework import viewsets
    from .models import Movie
    from .serializers import MovieSerializer
    
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    # Fertig! Alle CRUD-Operationen funktionieren!
    4

    URLs konfigurieren (DRF)

    # urls.py
    from rest_framework.routers import DefaultRouter
    from .views import MovieViewSet
    
    router = DefaultRouter()
    router.register('movies', MovieViewSet)
    
    urlpatterns = router.urls
    
    # URLs automatisch generiert!
    5

    Fertig! API testen

    # Server starten
    python manage.py runserver
    
    # API-Endpoints verfügbar:
    GET    http://localhost:8000/api/movies/
    POST   http://localhost:8000/api/movies/
    GET    http://localhost:8000/api/movies/1/
    PUT    http://localhost:8000/api/movies/1/
    PATCH  http://localhost:8000/api/movies/1/
    DELETE http://localhost:8000/api/movies/1/
    
    # Im Browser: Browsable API!
    # Mit Postman: JSON-Requests!
    # Von React App: fetch() Calls!
    
    🎉 Produktionsreife API in 20 Zeilen Code!

    🤔 Django vs DRF - Wann was nutzen?

    Die richtige Technologie für Ihr Projekt

    🌐

    Nutzen Sie Django (Templates)

    Traditionelle Server-Rendered Websites

    • Blog/News-Seite: Content-fokussiert, SEO wichtig
    • E-Commerce (klein-mittel): Klassischer Shop mit Server-HTML
    • Admin-Panel: Internes Tool für Mitarbeiter
    • Landing Pages: Marketing-Seiten mit Forms
    • CMS: Content-Management für Redakteure

    Vorteil: Schnell entwickelt, SEO perfekt, alles in einem

    ⚠️ Nachteil: Kein "App-Feeling", bei jedem Klick Reload

    🔌

    Nutzen Sie DRF (REST API)

    Moderne API-First Projekte

    • Mobile App: iOS/Android App braucht Backend
    • Single Page App: React/Vue/Angular Frontend
    • Microservices: Service-Architektur
    • IoT: Geräte senden/empfangen Daten
    • Public API: Andere Entwickler nutzen Ihre API
    • Multi-Platform: Eine API für Web, App, Desktop

    Vorteil: Flexibel, modern, App-Feeling, wiederverwendbar

    ⚠️ Nachteil: Mehr Komplexität (Frontend + Backend getrennt)

    💡 Oder beides kombinieren!

    Hybrid-Ansatz:
    
    myproject/
    ├── api/               # DRF für Mobile App
    │   └── views.py       # → JSON API
    │
    └── web/               # Django Templates für Website
        └── views.py       # → HTML Seiten
    
    # Beispiel: Netflix
    # - Website: Django Templates
    # - Mobile App: DRF API
    # - Smart TV: DRF API
    
    # Beste aus beiden Welten!

    ⭐ Warum ist Django so beliebt?

    🚀

    1. Batteries Included

    Alles dabei, was Sie brauchen

    • Admin-Panel (automatisch generiert!)
    • User-Management (Login, Registrierung, Permissions)
    • ORM (Datenbank ohne SQL)
    • Forms (mit Validierung)
    • Security (CSRF, XSS, SQL-Injection Schutz)
    • Caching, Sessions, Emails...

    → Sie bauen Features, nicht Infrastruktur!

    2. Rapid Development

    Von Idee zu Produkt in Rekordzeit

    • MVP in Tagen: Prototyp schnell fertig
    • Wenig Code: Django macht vieles automatisch
    • DRY-Prinzip: Code nicht wiederholen
    • Viele Packages: 4000+ Apps verfügbar

    Perfekt für Startups und tight Deadlines!

    🛡️

    3. Security First

    Sicherheit eingebaut

    • CSRF-Protection: Automatisch aktiviert
    • SQL-Injection: ORM verhindert es
    • XSS-Protection: Templates escapen HTML
    • Clickjacking: X-Frame-Options Header
    • Password Hashing: Bcrypt/PBKDF2

    Sie müssen nicht Sicherheits-Experte sein!

    📈

    4. Skalierbar

    Von 10 zu 10 Millionen Usern

    • Instagram: 2+ Milliarden User
    • Caching: Redis, Memcached Support
    • Load Balancing: Mehrere Server möglich
    • Database Sharding: Große Datenmengen

    Wächst mit Ihrem Projekt mit!

    📚

    5. Großartige Dokumentation

    Beste Docs im Web-Framework-Bereich

    • Vollständig: Jedes Feature dokumentiert
    • Anfängerfreundlich: Tutorials inklusive
    • Beispiele: Code-Snippets überall
    • Aktuell: Mit jeder Version updated

    docs.djangoproject.com → Ihre Bibel!

    👥

    6. Riesige Community

    Hilfe überall

    • Stack Overflow: 300,000+ Django-Fragen
    • GitHub: 70,000+ Stars
    • Packages: PyPI hat 1000e Django-Apps
    • Konferenzen: DjangoCon weltweit

    Problem? Google findet 99% der Lösungen!

    🎓 Django's Philosophie - Die Grundprinzipien

    Diese Prinzipien machen Django besonders

    Verstehen Sie die Denkweise hinter Django

    📝

    DRY - Don't Repeat Yourself

    "Schreibe keinen Code zweimal"

    # ❌ Schlecht: Code wiederholt
    def get_movies_for_web():
        return Movie.objects.filter(is_active=True)
    
    def get_movies_for_api():
        return Movie.objects.filter(is_active=True)
    
    # ✅ Gut: Einmal definieren
    class Movie(models.Model):
        # ...
        @classmethod
        def get_active(cls):
            return cls.objects.filter(is_active=True)
    
    # Überall nutzen:
    Movie.get_active()  # In Web-Views
    Movie.get_active()  # In API-Views

    Django hilft, Code-Duplikation zu vermeiden. Ein Konzept, eine Implementierung!

    🔗

    Loose Coupling

    "Komponenten sind unabhängig"

    # Model weiß nichts von View
    class Movie(models.Model):
        title = models.CharField(max_length=200)
    
    # View weiß nichts von Template
    def movie_list(request):
        movies = Movie.objects.all()
        return render(request, 'movies.html', {'movies': movies})
    
    # Template weiß nichts von Datenbank
    {% for movie in movies %}
        
  • {{ movie.title }}
  • {% endfor %} # Jede Schicht ist austauschbar! # Model ändern → View funktioniert weiter # Template ändern → Model bleibt gleich

    Sie können jede Komponente ändern, ohne andere zu brechen. Flexibilität pur!

    Explicit is better than Implicit

    "Code soll klar sein, keine Magie"

    # Django macht Dinge explizit sichtbar
    
    # ✅ Sie sehen, was passiert:
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()          # ← Welche Daten?
        serializer_class = MovieSerializer      # ← Wie serialisiert?
        permission_classes = [IsAuthenticated]  # ← Wer darf zugreifen?
    
    # Keine versteckte Magie!
    # Alles ist im Code sichtbar und nachvollziehbar
    
    # ❌ Andere Frameworks verstecken Logik:
    # @MagicDecorator  # ← Was macht das genau?
    # def view():
    #     pass  # ← Woher kommen die Daten?

    Kein "Magic" - Sie verstehen immer, was Ihr Code macht!

    🎯

    Convention over Configuration

    "Sinnvolle Defaults, aber anpassbar"

    # Django hat kluge Standard-Einstellungen
    
    # Standard-Struktur (funktioniert sofort):
    myapp/
        models.py      # ← Django weiß: Hier sind Models
        views.py       # ← Django weiß: Hier sind Views
        urls.py        # ← Django weiß: Hier sind URLs
        templates/     # ← Django weiß: Hier ist HTML
    
    # Aber alles anpassbar!
    # settings.py:
    TEMPLATES = [{
        'DIRS': ['/my/custom/path/'],  # ← Eigener Pfad
    }]
    
    # Beste aus beiden Welten:
    # - Anfänger: Nutzen Conventions (schnell loslegen)
    # - Profis: Konfigurieren alles nach Bedarf

    Sie müssen nicht alles konfigurieren - Django hat sinnvolle Defaults. Aber wenn nötig, ist alles anpassbar!

    🚀

    Rapid Development

    "Von Idee zu Produkt in Rekordzeit"

    # Django ist für schnelle Entwicklung gebaut
    
    # Tag 1: Model erstellen
    class Movie(models.Model):
        title = models.CharField(max_length=200)
    
    # Tag 2: Admin-Panel (automatisch!)
    from django.contrib import admin
    admin.site.register(Movie)
    # → Fertige Admin-Oberfläche!
    
    # Tag 3: API (mit DRF)
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    # → Fertige REST API!
    
    # Tag 4-5: Frontend, Tests, Deploy
    # → MVP fertig! 🎉
    
    # Andere Frameworks: Wochen für gleiches Ergebnis

    "The web framework for perfectionists with deadlines" - Das ist nicht nur Marketing!

    🔒

    Security by Default

    "Sicherheit ist eingebaut, nicht optional"

    # Django macht Sicherheit automatisch
    
    # CSRF-Protection (Cross-Site Request Forgery):
    # Jedes Form hat automatisch CSRF-Token
    {% csrf_token %}  # ← Django fügt Token ein
    
    # XSS-Protection (Cross-Site Scripting):
    {{ user_input }}  # ← Automatisch escaped!
    # <script>alert('hack123')</script> wird zu:
    # <script>alert('hack')</script>
    
    # SQL-Injection unmöglich:
    Movie.objects.filter(title=user_input)
    # ← ORM escapet automatisch, keine manuelle SQL!
    
    # Clickjacking-Protection:
    # X-Frame-Options Header automatisch gesetzt
    
    # Sie müssen nichts tun - Django schützt Sie!

    Sicherheit ist kein Add-On, sondern Teil des Kerns!

    🛠️ Django Ecosystem - Die Tools drumherum

    Django ist nicht allein - Es gibt ein ganzes Ökosystem!

    Tausende von Packages erweitern Django's Funktionalität

    🔌

    Django REST Framework

    REST APIs bauen (unser Kurs-Fokus!)

    • Zweck: Aus Django eine API-Maschine machen
    • Features: Serializers, ViewSets, Authentication
    • Beliebtheit: 27,000+ GitHub Stars
    • Einsatz: Millionen von APIs weltweit
    pip install djangorestframework
    
    # In 5 Minuten eine API:
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    🔐

    Django Allauth

    Social Login (Google, Facebook, GitHub...)

    • Zweck: Login mit Social Media Accounts
    • Features: 50+ Provider, Email-Verification
    • Use Case: "Login with Google" Button
    pip install django-allauth
    
    # Features:
    # - Login mit Google
    # - Login mit Facebook
    # - Login mit GitHub
    # - Email-Bestätigung
    # - Passwort-Reset
    🎨

    Django Crispy Forms

    Schöne Forms ohne viel HTML

    • Zweck: Bootstrap/Tailwind Forms automatisch
    • Features: Layouts, Styling, Validierung
    • Vorteil: Forms in Python definieren, nicht HTML
    pip install django-crispy-forms
    
    # Forms werden automatisch schön:
    {% load crispy_forms_tags %}
    {{ form|crispy }}
    # → Bootstrap-styled Form!
    🗄️

    Django Debug Toolbar

    Performance-Analyse während Entwicklung

    • Zweck: SQL-Queries sehen, Performance messen
    • Features: Request-Details, Cache-Hits, Templates
    • Einsatz: Nur in Development!
    pip install django-debug-toolbar
    
    # Zeigt im Browser:
    # - Anzahl SQL-Queries
    # - Langsame Queries
    # - Template-Rendering-Zeit
    # - Cache-Statistiken
    # → N+1 Query Problems finden!
    💳

    Django Stripe

    Zahlungen akzeptieren

    • Zweck: Stripe-Integration für E-Commerce
    • Features: Subscriptions, Einmalzahlungen
    • Use Case: Online-Shop, SaaS-Abos
    pip install dj-stripe
    
    # Stripe-Zahlungen in Django:
    # - Kreditkarten
    # - Subscriptions
    # - Webhooks
    # - Invoices
    📧

    Django Celery

    Background Tasks & Async Jobs

    • Zweck: Lange Tasks asynchron ausführen
    • Features: Task Queue, Scheduling, Retries
    • Use Case: Emails senden, Reports generieren
    pip install celery
    
    # Hintergrund-Tasks:
    @task
    def send_newsletter(user_ids):
        # Läuft im Hintergrund
        for user_id in user_ids:
            send_email(user_id)
    
    # User wartet nicht!
    🔍

    Django Filter

    Such- und Filterfunktionen

    • Zweck: Komplexe Filterung in APIs/Views
    • Features: URL-Parameter → DB-Queries
    • Use Case: Produktsuche, Filterbare Listen
    pip install django-filter
    
    # Automatisches Filtering:
    class MovieFilter(django_filters.FilterSet):
        class Meta:
            model = Movie
            fields = ['genre', 'year']
    
    # /api/movies/?genre=Sci-Fi&year=1999
    # → Automatisch gefiltert!
    🌍

    Django CMS

    Content Management System

    • Zweck: Drag & Drop Website-Editor
    • Features: Page-Builder, Plugins, Multilingual
    • Use Case: Unternehmens-Websites
    pip install django-cms
    
    # Komplettes CMS:
    # - Drag & Drop Editor
    # - Page-Management
    # - Plugin-System
    # - Multi-Language
    # → WordPress-Alternative!

    ⚖️ Django vs Andere Frameworks

    Wie steht Django im Vergleich da?

    Jedes Framework hat seine Stärken - Hier ist Django's Platz

    Python Web Frameworks im Vergleich:

    ┌─────────────────┬──────────────┬──────────────┬──────────────┬──────────────┐
    │ Kriterium       │ Django       │ Flask        │ FastAPI      │ Pyramid      │
    ├─────────────────┼──────────────┼──────────────┼──────────────┼──────────────┤
    │ Typ             │ Full-Stack   │ Micro        │ Micro        │ Full-Stack   │
    │ Batteries       │ ✅ Viele     │ ⚠️ Wenige    │ ⚠️ Wenige    │ ✅ Viele     │
    │ Admin Panel     │ ✅ Ja        │ ❌ Nein      │ ❌ Nein      │ ❌ Nein      │
    │ ORM             │ ✅ Django ORM│ ⚠️ Optional  │ ⚠️ Optional  │ ⚠️ Optional  │
    │ Learning Curve  │ ⚠️ Mittel    │ ✅ Einfach   │ ✅ Einfach   │ ⚠️ Schwer    │
    │ Performance     │ ✅ Gut       │ ✅ Gut       │ ⭐ Sehr gut  │ ✅ Gut       │
    │ API Support     │ ✅ DRF       │ ✅ Flask-REST│ ⭐ Native    │ ✅ Cornice   │
    │ Async Support   │ ✅ Ab v3.1   │ ✅ Ja        │ ⭐ Native    │ ✅ Ja        │
    │ Use Case        │ Große Apps   │ Kleine Apps  │ APIs         │ Enterprise   │
    │ Community       │ ⭐ Sehr groß │ ✅ Groß      │ ✅ Wachsend  │ ⚠️ Klein     │
    │ Job Market      │ ⭐ Sehr viel │ ✅ Viel      │ ✅ Wachsend  │ ⚠️ Wenig     │
    └─────────────────┴──────────────┴──────────────┴──────────────┴──────────────┘
    🦸

    Django

    "Batteries Included" Full-Stack

    • Stärken: Alles dabei, schnell produktiv, sicher
    • Schwächen: Größer, learning curve steiler
    • Wähle Django wenn: Du ein komplettes Projekt baust (CMS, E-Commerce, Social Network)
    # Eine App in 10 Minuten:
    # - Models definieren
    # - Admin Panel ✅
    # - User Management ✅
    # - Forms ✅
    # - Security ✅
    # → Sofort produktiv!
    🧪

    Flask

    "Micro" Framework - Du entscheidest

    • Stärken: Klein, flexibel, einfach zu lernen
    • Schwächen: Vieles muss selbst gebaut/integriert werden
    • Wähle Flask wenn: Du ein kleines Projekt hast oder volle Kontrolle willst
    # Minimale App:
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return 'Hello!'
    
    # Aber: Admin? ORM? Auth?
    # → Musst du selbst bauen!

    FastAPI

    Modern, schnell, API-fokussiert

    • Stärken: Sehr schnell, native async, automatische Docs
    • Schwächen: Nur für APIs, kein Admin, junges Framework
    • Wähle FastAPI wenn: Du NUR eine API baust und Performance kritisch ist
    from fastapi import FastAPI
    app = FastAPI()
    
    @app.get("/movies/")
    async def get_movies():
        return movies
    
    # Automatische OpenAPI Docs!
    # Sehr schnell!
    # Aber: Keine Website-Features

    🎯 Django's Sweet Spot:

    • Große Anwendungen: CMS, E-Commerce, Social Networks, SaaS
    • Datenbank-intensiv: Viele Models, komplexe Relationen
    • User-Management: Login, Permissions, Roles
    • Admin-Interface: Content-Management für nicht-technische User
    • Schnelle Entwicklung: MVP in Tagen, nicht Wochen
    • Langfristige Projekte: Wartbar, erweiterbar, stabil

    🤝 Django und DRF - Das perfekte Team

    Wie arbeiten Django und DRF zusammen?

    Django ist die Basis, DRF erweitert für APIs

    Die Arbeitsteilung:

    ┌─────────────────────────────────────────────────────────────┐
    │                        Django (Core)                         │
    ├─────────────────────────────────────────────────────────────┤
    │                                                              │
    │  🗄️ Models (Datenbank-Struktur)                            │
    │  🔐 Authentication (User-System)                            │
    │  🛡️ Security (CSRF, XSS, SQL-Injection)                    │
    │  📝 Forms & Validation                                      │
    │  🔗 URL Routing                                             │
    │  ⚙️ Settings & Configuration                                │
    │  🗃️ Migrations                                              │
    │  👨‍💼 Admin Panel                                             │
    │                                                              │
    └─────────────────────────────────────────────────────────────┘
                                ↓
                        Nutzt Django's Features
                                ↓
    ┌─────────────────────────────────────────────────────────────┐
    │              Django REST Framework (DRF)                     │
    ├─────────────────────────────────────────────────────────────┤
    │                                                              │
    │  🔄 Serializers (Python ↔ JSON)                             │
    │  🎯 ViewSets (CRUD-Logic)                                   │
    │  🔗 Routers (Auto URL-Generation)                           │
    │  🔐 Token/JWT Authentication                                │
    │  🛡️ API Permissions                                         │
    │  📄 Pagination                                              │
    │  🔍 Filtering & Search                                      │
    │  🌐 Browsable API                                           │
    │  📚 OpenAPI/Swagger Docs                                    │
    │                                                              │
    └─────────────────────────────────────────────────────────────┘
    1

    Django macht die Basis

    # models.py - Django Core
    class Movie(models.Model):
        title = models.CharField(max_length=200)
        year = models.IntegerField()
        genre = models.CharField(max_length=100)
        
        class Meta:
            db_table = 'movies'
            ordering = ['-year']
    
    # Django kümmert sich um:
    # - Datenbank-Tabelle erstellen
    # - SQL-Queries generieren
    # - Validation
    # - Migrations
    2

    DRF macht die API

    # serializers.py - DRF
    class MovieSerializer(serializers.ModelSerializer):
        class Meta:
            model = Movie  # ← Nutzt Django Model!
            fields = '__all__'
    
    # DRF macht:
    # - Python Object → JSON
    # - JSON → Python Object
    # - Validierung für API-Requests
    3

    DRF nutzt Django's Features

    # views.py - DRF
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()  # ← Django ORM!
        serializer_class = MovieSerializer
        permission_classes = [IsAuthenticated]  # ← Django Auth!
    
    # DRF baut auf Django auf:
    # - Nutzt Django's Models
    # - Nutzt Django's Authentication
    # - Nutzt Django's Permissions
    # - Nutzt Django's URL-System

    💡 Wichtig zu verstehen:

    • DRF ist KEIN separates Framework - es ist eine Erweiterung für Django
    • Sie brauchen Django, um DRF zu nutzen (DRF ohne Django geht nicht!)
    • DRF erweitert Django um API-spezifische Features
    • Alles was Django kann, können Sie auch in DRF nutzen (Models, Auth, Admin...)
    • Sie installieren beides: pip install django djangorestframework

    🌍 Realwelt-Beispiel: Blog mit Django vs API mit DRF

    Gleiche Daten, unterschiedliche Präsentation

    Ein konkretes Beispiel zum Verstehen

    📝

    Szenario 1: Traditioneller Blog (Django)

    # models.py (gleich für beide!)
    class BlogPost(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        author = models.ForeignKey(User, on_delete=CASCADE)
        published_at = models.DateTimeField(auto_now_add=True)
    
    # views.py - Django Template View
    def blog_list(request):
        posts = BlogPost.objects.all()
        return render(request, 'blog/list.html', {
            'posts': posts
        })
    
    # templates/blog/list.html
    <!DOCTYPE html>
    <html>
    <head><title>Mein Blog</title></head>
    <body>
        <h1>Alle Blog-Posts</h1>
        {% for post in posts %}
            <article>
                <h2>{{ post.title }}</h2>
                <p>{{ post.content }}</p>
                <small>Von {{ post.author }} am {{ post.published_at }}</small>
            </article>
        {% endfor %}
    </body>
    </html>
    
    # User-Erlebnis:
    # - Besucht: www.meinblog.de/posts/
    # - Sieht: Komplette HTML-Seite
    # - Klick auf Post → Neue Seite lädt
    # - Klassische Website
    🔌

    Szenario 2: Blog als API (DRF)

    # models.py (gleich wie oben!)
    # Gleiche BlogPost Model
    
    # serializers.py - DRF
    class BlogPostSerializer(serializers.ModelSerializer):
        author_name = serializers.CharField(source='author.username', read_only=True)
        
        class Meta:
            model = BlogPost
            fields = ['id', 'title', 'content', 'author_name', 'published_at']
    
    # views.py - DRF ViewSet
    class BlogPostViewSet(viewsets.ModelViewSet):
        queryset = BlogPost.objects.all()
        serializer_class = BlogPostSerializer
    
    # urls.py
    router = DefaultRouter()
    router.register('posts', BlogPostViewSet)
    
    # Response (JSON):
    GET /api/posts/
    
    [
      {
        "id": 1,
        "title": "Mein erster Post",
        "content": "Das ist der Inhalt...",
        "author_name": "Max",
        "published_at": "2025-11-09T10:30:00Z"
      },
      {
        "id": 2,
        "title": "Zweiter Post",
        "content": "Mehr Inhalt...",
        "author_name": "Anna",
        "published_at": "2025-11-10T14:20:00Z"
      }
    ]
    
    # User-Erlebnis:
    # - React App ruft API auf
    # - Baut HTML dynamisch
    # - Smooth Scrolling, keine Reloads
    # - App-Feeling!

    🤔 Welchen Ansatz wählen?

    ┌─────────────────────────┬──────────────────────┬──────────────────────┐
    │ Frage                   │ Django (Traditional) │ DRF (API)            │
    ├─────────────────────────┼──────────────────────┼──────────────────────┤
    │ Nur Website?            │ ✅ Perfekt           │ ⚠️ Overkill         │
    │ Auch Mobile App geplant?│ ❌ Schwierig         │ ✅ Perfekt           │
    │ SEO wichtig?            │ ✅ Sehr gut          │ ⚠️ SSR nötig         │
    │ Modernes UI (React/Vue)?│ ⚠️ Kompliziert       │ ✅ Ideal             │
    │ Schnelle Entwicklung?   │ ✅ Sehr schnell      │ ⚠️ Frontend extra    │
    │ Mehrere Clients?        │ ❌ Schwierig         │ ✅ Eine API für alle │
    │ Interaktivität?         │ ⚠️ Page Reloads      │ ✅ Smooth            │
    └─────────────────────────┴──────────────────────┴──────────────────────┘

    💡 Oder beides kombinieren!

    Hybrid-Lösung (Beste aus beiden Welten):
    
    myproject/
    ├── blog/                 # Django App für Website
    │   ├── views.py         # → render() für HTML
    │   ├── templates/       # → HTML Templates
    │   └── urls.py          # → /blog/, /blog/post/1/
    │
    └── api/                  # DRF App für Mobile
        ├── serializers.py   # → JSON Responses
        ├── views.py         # → ViewSets
        └── urls.py          # → /api/posts/
    
    # Beispiel: Medium.com
    # - Website: Server-rendered für SEO
    # - Mobile App: REST API
    # - Admin: Django Admin Panel
    
    # Sie müssen sich nicht entscheiden - nutzen Sie beides!

    🎓 Learning Path - Von Django zu DRF

    Die richtige Reihenfolge zum Lernen

    Schritt für Schritt zum API-Profi

    Ihr Lernweg in diesem Kurs:

    1

    Django Grundlagen

    Models verstehen

    • Was sind Models?
    • Datenbank-Struktur definieren
    • Migrations durchführen
    • ORM nutzen (QuerySets)

    → Die Basis für alles weitere!

    2

    Django Admin

    Daten verwalten

    • Admin Panel kennenlernen
    • Models registrieren
    • Testdaten anlegen
    • CRUD-Operationen verstehen

    → Sehen wie Django mit Daten umgeht

    3

    REST Konzepte

    Was ist eine API?

    • REST-Prinzipien
    • HTTP-Methoden (GET, POST, ...)
    • JSON-Format
    • Status Codes

    → Theorie bevor wir loslegen

    4

    DRF Installation

    DRF Setup

    • DRF installieren
    • Settings konfigurieren
    • Browsable API aktivieren

    → Django wird zur API-Maschine!

    5

    Serializers

    Daten-Konvertierung

    • Was sind Serializers?
    • ModelSerializer erstellen
    • Python ↔ JSON
    • Validierung

    → Das Herzstück von DRF!

    6

    Views & ViewSets

    API-Logik

    • Function-Based Views
    • Class-Based Views
    • Generic Views
    • ViewSets (Best Practice!)

    → Von einfach zu elegant!

    7

    URLs & Routing

    Endpoints definieren

    • URL-Patterns
    • Router nutzen
    • Automatisches Routing

    → API-Struktur festlegen

    8

    Authentication

    Zugriff schützen

    • Token Authentication
    • JWT
    • Permissions

    → Nur für angemeldete User!

    9

    Advanced Features

    API optimieren

    • Pagination
    • Filtering & Search
    • Caching
    • Throttling

    → Production-ready machen!

    10

    Testing & Deployment

    Live gehen

    • Unit Tests
    • Integration Tests
    • API Documentation
    • Deployment

    → Fertig für Production!

    📁 Typische Django + DRF Projekt-Struktur

    So sieht ein professionelles Projekt aus

    Verstehen Sie die Organisation

    firstmovieapi/                    # 🏠 Projekt-Root
    │
    ├── venv/                         # 🔒 Virtuelle Umgebung
    │   └── ...                       # Python Packages isoliert
    │
    ├── firstmovieapi/                # ⚙️ Projekt-Konfiguration
    │   ├── __init__.py
    │   ├── settings.py               # ⚙️ Alle Einstellungen
    │   │   # - INSTALLED_APPS (Django + DRF)
    │   │   # - REST_FRAMEWORK Settings
    │   │   # - Database Config
    │   │   # - Authentication
    │   │
    │   ├── urls.py                   # 🔗 Haupt-URL-Routing
    │   │   # /admin/ → Django Admin
    │   │   # /api/ → DRF API
    │   │
    │   ├── wsgi.py                   # 🌐 Deployment (Apache/Nginx)
    │   └── asgi.py                   # ⚡ Async Support
    │
    ├── movies/                       # 🎬 App: Movies
    │   ├── migrations/               # 🗃️ Datenbank-Änderungen
    │   │   ├── 0001_initial.py
    │   │   └── ...
    │   │
    │   ├── __init__.py
    │   ├── models.py                 # 🗄️ Django Models
    │   │   # class Movie(models.Model)
    │   │   # class Artist(models.Model)
    │   │   # class MovieCasting(models.Model)
    │   │
    │   ├── serializers.py            # 🔄 DRF Serializers
    │   │   # class MovieSerializer(...)
    │   │   # class ArtistSerializer(...)
    │   │
    │   ├── views.py                  # 🎯 DRF ViewSets
    │   │   # class MovieViewSet(...)
    │   │   # class ArtistViewSet(...)
    │   │
    │   ├── urls.py                   # 🔗 App-URLs
    │   │   # Router für ViewSets
    │   │
    │   ├── admin.py                  # 👨‍💼 Django Admin Config
    │   │   # admin.site.register(Movie)
    │   │
    │   ├── tests.py                  # ✅ Unit Tests
    │   │   # class MovieAPITestCase(...)
    │   │
    │   └── apps.py                   # 📦 App-Konfiguration
    │
    ├── static/                       # 🎨 CSS, JS, Images
    │   └── ...                       # (Optional, für Admin/Browsable API)
    │
    ├── media/                        # 📁 User Uploads
    │   └── ...                       # (Film-Poster, etc.)
    │
    ├── manage.py                     # 🔧 Django Management-Tool
    │   # python manage.py runserver
    │   # python manage.py migrate
    │   # python manage.py createsuperuser
    │
    ├── requirements.txt              # 📦 Dependencies
    │   # Django==5.1.3
    │   # djangorestframework==3.14.0
    │   # ...
    │
    ├── .env                          # 🔐 Secrets (nicht in Git!)
    │   # SECRET_KEY=...
    │   # DATABASE_URL=...
    │
    ├── .gitignore                    # 🙈 Was Git ignorieren soll
    │   # venv/
    │   # *.pyc
    │   # db.sqlite3
    │
    └── README.md                     # 📖 Projekt-Dokumentation

    🎯 Wichtige Dateien erklärt:

    ⚙️

    settings.py

    # Zentrale Konfiguration:
    INSTALLED_APPS = [
        'django.contrib.admin',
        'rest_framework',  # DRF
        'movies',  # Unsere App
    ]
    
    REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAuthenticated',
        ]
    }
    🗄️

    models.py

    # Datenbank-Struktur:
    class Movie(models.Model):
        title = models.CharField(max_length=200)
        year = models.IntegerField()
    
    # Django macht daraus Tabelle:
    # CREATE TABLE movies_movie (
    #     id INTEGER PRIMARY KEY,
    #     title VARCHAR(200),
    #     year INTEGER
    # );
    🔄

    serializers.py

    # Python ↔ JSON:
    class MovieSerializer(serializers.ModelSerializer):
        class Meta:
            model = Movie
            fields = '__all__'
    
    # Movie Object → JSON
    # JSON → Movie Object
    🎯

    views.py

    # API-Logik:
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    # Alle CRUD-Operationen:
    # GET, POST, PUT, PATCH, DELETE

    ✅ Zusammenfassung - Was Sie jetzt wissen

    Django & DRF verstanden!

    🎯

    Was ist Django?

    • ✅ Web-Framework für Python
    • ✅ "Batteries Included" - Alles dabei
    • ✅ Für Websites & APIs
    • ✅ MTV-Architektur (Model-Template-View)
    • ✅ Admin Panel automatisch
    • ✅ Sicher, schnell, bewährt
    🌐

    Was kann Django?

    • ✅ Traditionelle Websites (Server-HTML)
    • ✅ CMS, Blogs, News-Portale
    • ✅ E-Commerce, Social Networks
    • ✅ Admin-Tools, Business-Apps
    • ✅ Alles mit Datenbank!
    🔌

    Was ist DRF?

    • ✅ Erweiterung für Django
    • ✅ Macht Django zur API-Maschine
    • ✅ Serializers (Python ↔ JSON)
    • ✅ ViewSets (Auto-CRUD)
    • ✅ Authentication & Permissions
    • ✅ Browsable API zum Testen

    Warum DRF?

    • ✅ Für Mobile Apps (iOS/Android)
    • ✅ Für SPAs (React/Vue/Angular)
    • ✅ Für Microservices
    • ✅ Für IoT-Geräte
    • ✅ Eine API, viele Clients!
    🤝

    Django + DRF zusammen

    • ✅ Django = Basis (Models, DB, Auth)
    • ✅ DRF = API-Layer darüber
    • ✅ Teilen gleiche Models
    • ✅ Kombinierbar (Website + API)
    • ✅ Beste aus beiden Welten!
    🌟

    Warum Django lernen?

    • ✅ Instagram, Spotify nutzen es
    • ✅ Schnelle Entwicklung
    • ✅ Große Community
    • ✅ Viele Jobs
    • ✅ Production-ready
    • ✅ Zukunftssicher

    🚀 Was kommt als nächstes?

    Ihr Weg zum API-Entwickler

    Jetzt wird's praktisch!

    Jetzt verstanden

    Was Django & DRF sind

    • Unterschied Website vs API
    • Django's Rolle
    • DRF's Rolle
    • Wann was nutzen

    Als nächstes

    Django Setup & Grundlagen

    • Python & Django installieren
    • Erstes Projekt erstellen
    • Models definieren
    • Migrations durchführen
    • Admin Panel nutzen

    Dann

    DRF Installation & erste API

    • DRF installieren
    • Serializers erstellen
    • ViewSets bauen
    • Router konfigurieren
    • Erste API testen!

    Schließlich

    Advanced Features

    • Authentication implementieren
    • Permissions konfigurieren
    • Filtering & Pagination
    • Testing schreiben
    • Deployment vorbereiten

    🎯 Ihr Ziel am Ende des Kurses:

    Eine vollständige, produktionsreife Movie-API:

    GET    /api/movies/           → Liste aller Filme
    POST   /api/movies/           → Neuen Film erstellen
    GET    /api/movies/1/         → Film Details
    PUT    /api/movies/1/         → Film bearbeiten
    DELETE /api/movies/1/         → Film löschen
    GET    /api/movies/1/actors/  → Schauspieler des Films
    
    GET    /api/artists/          → Alle Künstler
    GET    /api/castings/         → Alle Besetzungen
    
    # Features:
    ✅ CRUD-Operationen
    ✅ Nested Relations (Film → Schauspieler)
    ✅ Authentication (Token/JWT)
    ✅ Permissions (Nur Admins dürfen löschen)
    ✅ Pagination (20 Filme pro Seite)
    ✅ Filtering (?genre=Sci-Fi)
    ✅ Search (?search=Matrix)
    ✅ API Documentation (Swagger)
    ✅ Unit Tests
    ✅ Production-ready!
    
    → Diese API können Sie für echte Projekte nutzen!

    💪 Warum sich Django & DRF lohnen

    Ihre Investition zahlt sich aus!

    🚀 Karriere-Boost

    Django-Skills sind gefragt

    • Job Market: 1000e offene Stellen weltweit
    • Gehalt: Django-Entwickler gut bezahlt
    • Remote: Viele Remote-Jobs verfügbar
    • Startups: Django = MVP in Rekordzeit

    "Django Developer" auf LinkedIn → 50,000+ Jobs

    ⚡ Produktivität

    Bauen Sie Apps in Rekordzeit

    • Schnell: MVP in Tagen, nicht Monaten
    • Weniger Code: Django macht vieles automatisch
    • Wartbar: Code bleibt sauber & verständlich
    • Skalierbar: Wächst mit Ihrem Projekt

    Entwickler sind bis zu 10x produktiver mit Django!

    🌍 Vielseitigkeit

    Ein Framework, viele Möglichkeiten

    • Websites: Blogs, CMS, E-Commerce
    • APIs: Mobile Apps, SPAs, Microservices
    • Admin-Tools: Interne Business-Apps
    • Prototypen: Schnelle Ideen-Validierung

    Vom Hobby-Projekt bis Instagram - alles möglich!

    🎓 Learning Investment

    Was Sie lernen, bleibt relevant

    • Zukunftssicher: Django seit 20 Jahren stabil
    • Transferable Skills: REST, ORM, MVT nützlich überall
    • Community: Riesige Community hilft immer
    • Dokumentation: Beste Docs im Web-Framework-Bereich

    Skills die 2025 relevant sind, werden 2030 noch relevant sein!

    🎯 Nach diesem Kurs können Sie:

    • ✅ Eigene Web-Apps von Grund auf bauen
    • ✅ REST APIs für Mobile Apps entwickeln
    • ✅ Datenbank-Strukturen professionell designen
    • ✅ User-Management & Authentication implementieren
    • ✅ APIs sicher & performant machen
    • ✅ Django-Jobs annehmen
    • ✅ Eigene Startup-Ideen umsetzen
    • ✅ Als Backend-Developer arbeiten

    Bereit loszulegen! 🚀

    Sie verstehen jetzt Django & DRF!

    Was Sie jetzt wissen:

    • ✅ Django ist ein Full-Stack Web-Framework für Python
    • ✅ Django kann traditionelle Websites UND APIs bauen
    • ✅ DRF erweitert Django um moderne REST API Features
    • ✅ Instagram, Spotify & viele andere nutzen Django
    • ✅ Django + DRF = Perfektes Team für moderne Web-Entwicklung

    🎯 Der Unterschied auf einen Blick:

    ┌──────────────────────────────────────────────────────────┐
    │                                                          │
    │  Django (Core)           Django REST Framework (DRF)    │
    │  ──────────────          ────────────────────────────    │
    │                                                          │
    │  🌐 Websites             🔌 APIs                         │
    │  📄 HTML Output          📊 JSON Output                  │
    │  🎨 Templates            🔄 Serializers                  │
    │  👁️ Browser-Views        🎯 ViewSets                     │
    │  🖱️ Page Reloads         ⚡ Smooth (SPA)                 │
    │                                                          │
    │  ✅ Perfekt für:         ✅ Perfekt für:                 │
    │  - Blogs                 - Mobile Apps                   │
    │  - CMS                   - React/Vue Apps                │
    │  - E-Commerce            - Microservices                 │
    │  - Admin-Panels          - IoT-Backends                  │
    │                                                          │
    │  💡 Können kombiniert werden in einem Projekt!          │
    │                                                          │
    └──────────────────────────────────────────────────────────┘

    🎬 Jetzt geht's los!

    Im nächsten Modul installieren wir Django und bauen unsere erste App!

    Nächste Slide: Django Setup - Von der Installation zur ersten App

    📋 Cheat Sheet - Django Grundlagen

    Die wichtigsten Django-Konzepte zum Nachschlagen

    🗄️

    Models (Datenbank)

    # models.py
    from django.db import models
    
    class Movie(models.Model):
        title = models.CharField(max_length=200)
        year = models.IntegerField()
        rating = models.DecimalField(
            max_digits=3, 
            decimal_places=1
        )
        
        def __str__(self):
            return f"{self.title} ({self.year})"
    
    # Befehle:
    python manage.py makemigrations  # Migration erstellen
    python manage.py migrate         # DB updaten
    
    # Queries:
    Movie.objects.all()              # Alle Filme
    Movie.objects.get(id=1)          # Film mit ID 1
    Movie.objects.filter(year=1999)  # Filme von 1999
    Movie.objects.create(...)        # Neuen Film erstellen
    🎨

    Templates (HTML)

    <!-- templates/movies/list.html -->
    {% extends 'base.html' %}
    
    {% block content %}
      <h1>Alle Filme</h1>
      
      {% for movie in movies %}
        <div>
          <h2>{{ movie.title }}</h2>
          <p>Jahr: {{ movie.year }}</p>
          <p>Rating: {{ movie.rating }}</p>
        </div>
      {% empty %}
        <p>Keine Filme vorhanden.</p>
      {% endfor %}
      
      {% if user.is_authenticated %}
        <a href="{% url 'movie_create' %}">Neuer Film</a>
      {% endif %}
    {% endblock %}
    
    <!-- Template Tags: -->
    {{ variable }}           <!-- Variable ausgeben -->
    {% tag %}                <!-- Template Tag -->
    {% url 'name' %}         <!-- URL generieren -->
    {% static 'file.css' %}  <!-- Static File -->
    ⚙️

    Views (Logik)

    # views.py
    from django.shortcuts import render, get_object_or_404
    from .models import Movie
    
    # Function-Based View
    def movie_list(request):
        movies = Movie.objects.all()
        return render(request, 'movies/list.html', {
            'movies': movies
        })
    
    def movie_detail(request, pk):
        movie = get_object_or_404(Movie, pk=pk)
        return render(request, 'movies/detail.html', {
            'movie': movie
        })
    
    # Class-Based View
    from django.views.generic import ListView
    
    class MovieListView(ListView):
        model = Movie
        template_name = 'movies/list.html'
        context_object_name = 'movies'
    🔗

    URLs (Routing)

    # urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.movie_list, name='movie_list'),
        path('<int:pk>/', views.movie_detail, name='movie_detail'),
        path('create/', views.movie_create, name='movie_create'),
    ]
    
    # Projekt urls.py
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('movies/', include('movies.urls')),
    ]
    
    # URLs aufrufen:
    # /movies/           → movie_list
    # /movies/1/         → movie_detail
    # /movies/create/    → movie_create
    👨‍💼

    Admin (Verwaltung)

    # admin.py
    from django.contrib import admin
    from .models import Movie
    
    @admin.register(Movie)
    class MovieAdmin(admin.ModelAdmin):
        list_display = ['title', 'year', 'rating']
        list_filter = ['year', 'genre']
        search_fields = ['title']
        ordering = ['-year']
    
    # Oder einfach:
    admin.site.register(Movie)
    
    # Superuser erstellen:
    python manage.py createsuperuser
    
    # Admin-Panel aufrufen:
    # http://localhost:8000/admin/
    📝

    Forms (Formulare)

    # forms.py
    from django import forms
    from .models import Movie
    
    class MovieForm(forms.ModelForm):
        class Meta:
            model = Movie
            fields = ['title', 'year', 'rating']
    
    # views.py
    def movie_create(request):
        if request.method == 'POST':
            form = MovieForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('movie_list')
        else:
            form = MovieForm()
        return render(request, 'movies/create.html', {
            'form': form
        })
    
    # Template:
    <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button type="submit">Speichern</button>
    </form>

    📋 Cheat Sheet - Django REST Framework

    Die wichtigsten DRF-Konzepte zum Nachschlagen

    🔄

    Serializers

    # serializers.py
    from rest_framework import serializers
    from .models import Movie
    
    # ModelSerializer (einfachste)
    class MovieSerializer(serializers.ModelSerializer):
        class Meta:
            model = Movie
            fields = '__all__'  # Alle Felder
            # fields = ['id', 'title', 'year']  # Spezifische
            # exclude = ['created_at']  # Außer
    
    # Mit Custom Fields
    class MovieSerializer(serializers.ModelSerializer):
        actors_count = serializers.SerializerMethodField()
        
        class Meta:
            model = Movie
            fields = ['id', 'title', 'actors_count']
        
        def get_actors_count(self, obj):
            return obj.castings.count()
    
    # Nested Serializer
    class MovieDetailSerializer(serializers.ModelSerializer):
        actors = ArtistSerializer(many=True, read_only=True)
        
        class Meta:
            model = Movie
            fields = '__all__'
    🎯

    ViewSets

    # views.py
    from rest_framework import viewsets
    from .models import Movie
    from .serializers import MovieSerializer
    
    # ModelViewSet (alle CRUD-Operationen)
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    # ReadOnlyModelViewSet (nur lesen)
    class MovieViewSet(viewsets.ReadOnlyModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    # Custom Actions
    from rest_framework.decorators import action
    
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
        
        @action(detail=False, methods=['get'])
        def top_rated(self, request):
            movies = self.queryset.filter(rating__gte=8.0)
            serializer = self.get_serializer(movies, many=True)
            return Response(serializer.data)
    🔗

    URLs & Router

    # urls.py
    from rest_framework.routers import DefaultRouter
    from .views import MovieViewSet
    
    router = DefaultRouter()
    router.register('movies', MovieViewSet, basename='movie')
    
    urlpatterns = router.urls
    
    # Generiert automatisch:
    # GET    /movies/          → list
    # POST   /movies/          → create
    # GET    /movies/{id}/     → retrieve
    # PUT    /movies/{id}/     → update
    # PATCH  /movies/{id}/     → partial_update
    # DELETE /movies/{id}/     → destroy
    
    # Mit Custom Actions:
    # GET    /movies/top_rated/  → top_rated()
    
    # Projekt urls.py
    urlpatterns = [
        path('api/', include('movies.urls')),
    ]
    🔐

    Authentication

    # settings.py
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.TokenAuthentication',
        ],
    }
    
    INSTALLED_APPS = [
        'rest_framework.authtoken',
    ]
    
    # Token erstellen:
    from rest_framework.authtoken.models import Token
    token = Token.objects.create(user=user)
    
    # In Views nutzen:
    class MovieViewSet(viewsets.ModelViewSet):
        permission_classes = [IsAuthenticated]
        
    # API-Request mit Token:
    GET /api/movies/
    Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
    🛡️

    Permissions

    # Built-in Permissions
    from rest_framework.permissions import (
        AllowAny,
        IsAuthenticated,
        IsAdminUser,
        IsAuthenticatedOrReadOnly
    )
    
    class MovieViewSet(viewsets.ModelViewSet):
        permission_classes = [IsAuthenticatedOrReadOnly]
        # GET: Jeder
        # POST/PUT/DELETE: Nur angemeldet
    
    # Custom Permission
    from rest_framework import permissions
    
    class IsOwnerOrReadOnly(permissions.BasePermission):
        def has_object_permission(self, request, view, obj):
            if request.method in permissions.SAFE_METHODS:
                return True
            return obj.owner == request.user
    
    class MovieViewSet(viewsets.ModelViewSet):
        permission_classes = [IsOwnerOrReadOnly]
    📄

    Pagination, Filtering

    # settings.py - Pagination
    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 
            'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 20
    }
    
    # Filtering
    pip install django-filter
    
    INSTALLED_APPS = ['django_filters']
    
    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': [
            'django_filters.rest_framework.DjangoFilterBackend',
            'rest_framework.filters.SearchFilter',
            'rest_framework.filters.OrderingFilter',
        ]
    }
    
    # In ViewSet:
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
        filterset_fields = ['genre', 'year']
        search_fields = ['title']
        ordering_fields = ['year', 'rating']
    
    # Nutzen:
    # /api/movies/?genre=Sci-Fi
    # /api/movies/?search=matrix
    # /api/movies/?ordering=-year

    💻 Häufig genutzte Django-Befehle

    Projekt-Setup:

    # Virtuelle Umgebung erstellen
    python -m venv venv
    
    # Aktivieren (Windows)
    venv\Scripts\activate
    
    # Aktivieren (Linux/Mac)
    source venv/bin/activate
    
    # Django installieren
    pip install django djangorestframework
    
    # Projekt erstellen
    django-admin startproject myproject
    
    # App erstellen
    python manage.py startapp myapp
    
    # Development Server starten
    python manage.py runserver
    
    # Server auf anderem Port
    python manage.py runserver 8080

    Datenbank:

    # Migrations erstellen (nach Model-Änderungen)
    python manage.py makemigrations
    
    # Migrations anwenden
    python manage.py migrate
    
    # Migrations rückgängig (z.B. zu Migration 0003)
    python manage.py migrate myapp 0003
    
    # Alle Migrations anzeigen
    python manage.py showmigrations
    
    # SQL-Code einer Migration anzeigen
    python manage.py sqlmigrate myapp 0001
    
    # Datenbank zurücksetzen (VORSICHT!)
    python manage.py flush

    User & Admin:

    # Superuser erstellen
    python manage.py createsuperuser
    
    # Passwort ändern
    python manage.py changepassword username
    
    # Shell öffnen (Python mit Django-Kontext)
    python manage.py shell
    
    # Django Shell Plus (mit ipython)
    pip install django-extensions ipython
    python manage.py shell_plus

    Testing & Deployment:

    # Tests ausführen
    python manage.py test
    
    # Nur eine App testen
    python manage.py test myapp
    
    # Mit Coverage
    pip install coverage
    coverage run --source='.' manage.py test
    coverage report
    
    # Static Files sammeln (für Production)
    python manage.py collectstatic
    
    # Datenbank-Backup erstellen
    python manage.py dumpdata > backup.json
    
    # Datenbank-Backup laden
    python manage.py loaddata backup.json

    Nützliche Checks:

    # System-Check (Konfiguration prüfen)
    python manage.py check
    
    # Deployment-Check
    python manage.py check --deploy
    
    # Dependencies auflisten
    pip freeze > requirements.txt
    
    # Dependencies installieren
    pip install -r requirements.txt

    🔄 Typischer Django + DRF Workflow

    Von der Idee zur fertigen API

    So entwickeln Sie systematisch

    1

    📋 Planung

    Was soll die App können?

    • Datenmodell skizzieren (Welche Models?)
    • Beziehungen definieren (ForeignKey, ManyToMany?)
    • API-Endpoints planen (Welche Operationen?)
    Beispiel: Movie-App
    Models: Movie, Artist, MovieCasting
    Relations: Movie ↔ Artist (ManyToMany via MovieCasting)
    Endpoints: /movies/, /artists/, /castings/
    2

    🏗️ Setup

    Projekt aufsetzen

    # Virtuelle Umgebung
    python -m venv venv
    venv\Scripts\activate
    
    # Packages installieren
    pip install django djangorestframework
    
    # Projekt erstellen
    django-admin startproject firstmovieapi
    cd firstmovieapi
    
    # App erstellen
    python manage.py startapp movies
    
    # In settings.py registrieren:
    INSTALLED_APPS = [
        'rest_framework',
        'movies',
    ]
    3

    🗄️ Models erstellen

    Datenstruktur definieren

    # movies/models.py
    class Movie(models.Model):
        title = models.CharField(max_length=200)
        year = models.IntegerField()
        # ...
    
    class Artist(models.Model):
        first_name = models.CharField(max_length=100)
        # ...
    
    class MovieCasting(models.Model):
        movie = models.ForeignKey(Movie, on_delete=CASCADE)
        artist = models.ForeignKey(Artist, on_delete=CASCADE)
        # ...
    
    # Migrations
    python manage.py makemigrations
    python manage.py migrate
    4

    👨‍💼 Admin konfigurieren

    Testdaten einfach verwalten

    # movies/admin.py
    from django.contrib import admin
    from .models import Movie, Artist, MovieCasting
    
    admin.site.register(Movie)
    admin.site.register(Artist)
    admin.site.register(MovieCasting)
    
    # Superuser erstellen
    python manage.py createsuperuser
    
    # Testdaten im Admin anlegen
    # http://localhost:8000/admin/
    5

    🔄 Serializers erstellen

    Python ↔ JSON Konvertierung

    # movies/serializers.py
    from rest_framework import serializers
    from .models import Movie, Artist
    
    class MovieSerializer(serializers.ModelSerializer):
        class Meta:
            model = Movie
            fields = '__all__'
    
    class ArtistSerializer(serializers.ModelSerializer):
        class Meta:
            model = Artist
            fields = '__all__'
    6

    🎯 ViewSets erstellen

    API-Logik implementieren

    # movies/views.py
    from rest_framework import viewsets
    from .models import Movie, Artist
    from .serializers import MovieSerializer, ArtistSerializer
    
    class MovieViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer
    
    class ArtistViewSet(viewsets.ModelViewSet):
        queryset = Artist.objects.all()
        serializer_class = ArtistSerializer
    7

    🔗 URLs konfigurieren

    Routing einrichten

    # movies/urls.py
    from rest_framework.routers import DefaultRouter
    from .views import MovieViewSet, ArtistViewSet
    
    router = DefaultRouter()
    router.register('movies', MovieViewSet)
    router.register('artists', ArtistViewSet)
    
    urlpatterns = router.urls
    
    # firstmovieapi/urls.py
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/', include('movies.urls')),
    ]
    8

    ✅ Testen

    API validieren

    # Server starten
    python manage.py runserver
    
    # Im Browser testen:
    http://localhost:8000/api/movies/
    http://localhost:8000/api/artists/
    
    # Mit Postman/curl testen
    # GET, POST, PUT, DELETE probieren
    
    # Unit Tests schreiben
    # movies/tests.py
    9

    🚀 Erweitern

    Features hinzufügen

    • Authentication implementieren
    • Permissions konfigurieren
    • Filtering & Pagination
    • Custom Actions
    • API Documentation (Swagger)
    10

    🌐 Deployment

    Live gehen

    • Production Settings (DEBUG=False)
    • Static Files sammeln
    • Datenbank (PostgreSQL)
    • Deploy (Heroku, Railway, AWS...)

    📚 Ressourcen & Lernmaterial

    📖 Offizielle Dokumentation

    • Django Docs: docs.djangoproject.com
    • DRF Docs: django-rest-framework.org
    • Tutorial: Offizielles Django Tutorial (7 Teile)
    • Best Practices: Django Design Patterns

    Die beste Dokumentation im Web-Framework-Bereich!

    🎓 Online-Kurse

    • Udemy: Django for Beginners
    • Coursera: Django for Everybody
    • YouTube: Corey Schafer Django Tutorial
    • Real Python: Django Tutorials

    💬 Community

    • Forum: forum.djangoproject.com
    • Discord: Django Discord Server
    • Stack Overflow: [django] Tag
    • Reddit: r/django

    📦 Nützliche Packages

    • Django Packages: djangopackages.org
    • Awesome Django: GitHub Liste
    • PyPI: pypi.org (Python Package Index)

    📰 News & Blogs

    • Django News: django-news.com
    • Real Python: realpython.com
    • Django Stars: Blog
    • Full Stack Python: fullstackpython.com

    🎤 Podcasts & Videos

    • Django Chat: Podcast
    • Talk Python: Podcast (Python allgemein)
    • DjangoCon: Konferenz-Videos auf YouTube

    💡 Lerntipps:

    • 🔨 Learning by Doing: Bauen Sie echte Projekte!
    • 📖 Lesen Sie den Code: Django's Source Code ist gut lesbar
    • Fragen Sie: Community ist sehr hilfreich
    • 🔄 Üben Sie regelmäßig: Kontinuität > Intensität
    • 🎯 Setzen Sie Ziele: Konkrete Projekte als Motivation

    🎯 Key Takeaways - Das Wichtigste

    Was Sie aus dieser Einführung mitnehmen sollten

    1️⃣

    Django ist vielseitig

    Ein Framework für Websites UND APIs. Von Blogs bis Instagram - alles möglich.

    2️⃣

    DRF erweitert Django

    DRF ist KEIN separates Framework, sondern macht Django zur API-Maschine. Nutzt Django's Models, Auth, etc.

    3️⃣

    Batteries Included

    Admin-Panel, User-Management, Sicherheit - alles dabei. Sie fokussieren auf Features, nicht Infrastruktur.

    4️⃣

    MTV-Architektur

    Model (Daten), Template (Darstellung), View (Logik). Klare Trennung = wartbarer Code.

    5️⃣

    Production-Ready

    Instagram, Spotify & 1000e andere nutzen Django. Skaliert von 10 bis Millionen User.

    6️⃣

    Große Community

    20 Jahre alt, riesige Community, beste Dokumentation. Hilfe ist immer verfügbar.

    7️⃣

    Rapid Development

    "Perfectionists with Deadlines" - MVP in Tagen möglich. Schnell produktiv sein.

    8️⃣

    Kombinierbar

    Website + API in einem Projekt. Oder nur eins davon. Flexibel an Bedürfnisse anpassbar.

    📝 Merksätze:

    • Django = Full-Stack Web-Framework (Alles dabei für Websites & APIs)
    • DRF = Django + REST API Superkräfte (Serializers, ViewSets, Auth)
    • Django nutzen = Schneller entwickeln (Batterien inklusive)
    • DRF nutzen = Moderne APIs bauen (Mobile, SPA, IoT)
    • Zusammen = Unschlagbares Team (Beste aus beiden Welten)

    Willkommen in der Django-Welt! 🌟

    Sie sind bereit, Ihre erste App zu bauen!

    "The best time to plant a tree was 20 years ago. The second best time is now."

    — Chinesisches Sprichwort

    🎯 Was Sie jetzt tun sollten:

    1. Installieren Sie Django & DRF (falls noch nicht geschehen)
    2. Folgen Sie dem Kurs Schritt für Schritt
    3. Bauen Sie mit - Learning by Doing!
    4. Experimentieren Sie - Probieren Sie eigene Ideen
    5. Fragen Sie - Die Community hilft gerne

    🚀 Nächste Schritte:

    Nächstes Modul: Django Projekt Setup

    • Virtuelle Umgebung erstellen
    • Django installieren
    • Erstes Projekt starten
    • Models erstellen
    • Admin-Panel nutzen

    Los geht's! 💪

    1 / 34